package com.cg.design.graphicdesignpattern.proxy;

/**
 * 表示带名字的打印机的类（代理人）
 *
 * @program: LeetCode->PrinterProxy
 * @description: 表示带名字的打印机的类（代理人）
 * @author: cg
 * @create: 2022-04-04 08:57
 **/
public class PrinterProxy implements Printable {

    /**
     * 名字
     */
    private String name;
    /**
     * 本人
     */
    private Printable real;

    /**
     * 本人的类名
     */
    private String className;

    /**
     * 带名字的构造函数
     *
     * @param name
     */
    public PrinterProxy(String name, String className) {
        this.name = name;
        this.className = className;
    }

    @Override
    public synchronized void setPrinterName(String name) {
        if (real != null) {
            // 设置本人名字
            real.setPrinterName(name);
        }
        this.name = name;
    }

    @Override
    public String getPrinterName() {
        return name;
    }

    @Override
    public void print(String string) {
        realize();
        real.print(string);
    }

    /**
     * 生成“本人”
     */
    private synchronized void realize() {
        if (real == null) {
            try {
                real = (Printable) Class.forName(className).newInstance();
                real.setPrinterName(name);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
                System.out.println("没有找到 " + className + " 类");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}
